-
Notifications
You must be signed in to change notification settings - Fork 1.1k
cmake: Avoid contaminating parent project's cache with BUILD_SHARED_LIBS
#1688
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
base: master
Are you sure you want to change the base?
Conversation
The CMake cache is global in scope. Therefore, setting the standard cache variable `BUILD_SHARED_LIBS` can inadvertently affect the behavior of a parent project. This change: 1. Sets the `BUILD_SHARED_LIBS` cache variable only when libsecp256k1 is the top-level project. 2. Uses the `SECP256K1_DISABLE_SHARED` cache variable only when libsecp256k1 is included as a subproject.
cc @theuni |
@theuni @purpleKarrot Can one of you review this? |
I'd rather drop the complete block of code. Every CMake project should behave well as a subproject. This becomes even more relevant with FetchContent getting more and more adoption. Not only should projects not interfere with superprojects (like setting |
Sigh, this is again confusing as hell (at least to me as someone who is not a CMake expert). Let me try to organize the discussion. What is the cleanest thing to do in a library?
The docs say that top-level projects should call Can we drop the entire block?I might be wrong, but wouldn't dropping the
The thing is that, according to the docs, If we can drop the entire block, should we do it?I'm not sure, but I tend to say no. I'd rather keep the default of building a shared library and accept a few lines of CMake code. If we decide to drop it, we should at least document this in the README. Do we need
|
This excerpt from the docs literally describes how fragile it is to set
Additionally, from Professional CMake: A Practical Guide 21st Edition, Section 40.2:
When set using
The default state of
I agree with that. That's why I chose the suggested approach. A shared library is a real library and should be considered as the default by-product of the build process.
Using project-specific versions of well-known CMake variables is hard to maintain consistent. This project defines its own variable to override CMake's |
I hear you, @real-or-random. That deserves a longer explanation. I will provide extensive information with examples on the weekend. |
I hope to answer most of your questions here: https://njump.me/nevent1qqsyfmk89g3cfvq8u9p6hg3x4nd0j66tjgwkth45wpz493hv4f5z70spp4mhxue69uhkummn9ekx7mqzyq8sv8lyu6zjy5p8fmfa0pn4j95rvmr2rj7urnpdhvkk5r55fndjkd3z5dj |
That's a great post! What's your conclusion for this PR? From the post, it appears that you support the A minor comment, not related to the discussion here:
The point of the |
Note that modern gcc/clang support #if defined(__has_attribute)
# if __has_attribute(visibility)
# define HAS_VISIBILITY_ATTRIBUTE
# endif
#endif
#ifdef HAS_VISIBILITY_ATTRIBUTE
# define DEFAULT_VISIBILITY_ATTRIBUTE __attribute__((visibility("default")))
#else
# define DEFAULT_VISIBILITY_ATTRIBUTE
#endif Of course to be useful for libsecp it'd need a fallback for older versions. |
Thanks! It was a huge effort.
In my post, I show several approaches and possibilities. Project Qux sets In project Bar, I show that no such option is actually needed for building with both In project Baz, I show that even with For this PR, it means I would definitely drop the else part, and preferably the complete block of code. |
Clang supports visibility since version 2.0 and I am aware of 1309c03, but I cannot tell whether there is a actual use case to support compilers older than bitcoin, or whether that change was motivated by because-we-can. But yeah, that is off-topic for this PR. Please use nostr to comment on the blog post. |
The CMake cache is global in scope. Therefore, setting the standard cache variable
BUILD_SHARED_LIBS
can inadvertently affect the behavior of a parent project.Consider configuring Bitcoin Core without explicit setting
BUILD_SHARED_LIBS
:According to CMake’s documentation, this should configure
libbitcoinkernel
asSTATIC
.However, that's not the case:
This PR:
BUILD_SHARED_LIBS
cache variable only whenlibsecp256k1
is the top-level project.SECP256K1_DISABLE_SHARED
cache variable only whenlibsecp256k1
is included as a subproject.Alternatively, the entire code block can be dropped. In that case: